'''
题目描述：根据逆波兰表示法，求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。

个人补充：
逆波兰表达式（Reverse Polish Notation，简称 RPN），也叫后缀表达式，是一种数学表达式的表示方法。它的特点是运算符在操作数的后面，且不需要使用括号来表示运算的优先级。
与常规表达式的对比：
    中缀表达式（我们日常使用的）：a + b * c（运算符在操作数中间，需要括号控制优先级，如 (a + b) * c）
    逆波兰表达式：a b c * +（运算符在操作数后面，无需括号，运算顺序由位置自然决定）
逆波兰表达式的计算规则：
使用栈来计算，步骤如下：
    从左到右遍历表达式的每个元素
    如果是操作数，直接压入栈中
    如果是运算符，从栈中弹出两个操作数（先弹出的是右操作数，后弹出的是左操作数）
    用运算符对两个操作数进行计算，将结果压回栈中
    遍历结束后，栈中剩下的唯一元素就是表达式的结果


示例：
计算中缀表达式 (3 + 4) * 5 - 6，
对应的逆波兰表达式是 3 4 + 5 * 6 -，
计算过程(针对的是已经转为后缀表达式的表达式)：
步骤1： 3 入栈 → 栈：[3]
步骤2： 4 入栈 → 栈：[3, 4]
步骤3： 遇到 + → 弹出 4 和 3，计算 3+4=7 → 7 入栈 → 栈：[7]
步骤4： 5 入栈 → 栈：[7, 5]
步骤5： 遇到 * → 弹出 5 和 7，计算 7*5=35 → 35 入栈 → 栈：[35]
步骤6： 6 入栈 → 栈：[35, 6]
步骤7： 遇到 - → 弹出 6 和 35，计算 35-6=29 → 29 入栈 → 栈：[29]
最终结果：29

为什么要用逆波兰表达式？
1消除括号依赖：无需括号即可明确表示运算顺序，适合计算机处理
2计算高效：用栈即可线性扫描完成计算，时间复杂度 O(n)
3编译器友好：很多编译器的语法分析阶段会将中缀表达式转为逆波兰表达式再计算

在算法题中，逆波兰表达式求值是栈的经典应用场景，核心就是利用栈的 “后进先出” 特性匹配运算符和操作数。
'''


def eval_rpn(tokens):
    # 初始化一个栈，用于存储操作数
    stack = []
    # 遍历每个入参中的元素
    for token in tokens:
        # 如果是运算符 in 是 Python 中的成员运算符，用于检查左侧对象是否是右侧容器（如字符串、列表、元组等）的成员。
        if token in '+-*/':
            # 弹出两个操作数，注意顺序：先弹出的在右边，后弹出的在左边
            b = stack.pop()
            a = stack.pop()
            # 根据运算符进行计算
            if token == '+':
                stack.append(a + b)
            elif token == '-':
                stack.append(a - b)
            elif token == '*':
                stack.append(a * b)
            elif token == '/':
                ##这里向下取整处理
                stack.append(int(a / b))
        else:
            # 如果是数字，转换为整数后压入栈
            stack.append(int(token))

    # for循环完后，栈中最后剩下的元素就是结果
    return stack[0]


# 测试示例 注意：测试数据是已经转换为后缀表达式的表达式
print(eval_rpn(["2", "1", "+", "3", "*"]))  # 9
print(eval_rpn(["4", "13", "5", "/", "+"]))  # 6
print(eval_rpn(["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]))  # 22


print("-------------------")
#in 是 Python 中的成员运算符，用于检查左侧对象是否是右侧容器（如字符串、列表、元组等）的成员。
print("a" in "abcdefg")